[アップデート]AWS ProtonがCodeBuildプロビジョニングを通じてAWS CDKをサポートするようになりました
「AWS ProtonでAWS CDKが使えるようになった!」
環境の標準化に便利なサービスのProton。今年の3月にTerraformをサポートしました。
今回のアップデートでAWS Proton が CodeBuild プロビジョニングを通じて AWS CDK をサポートするようになりました。
AWS Proton now supports AWS CDK through CodeBuild provisioning
どういった流れで、AWS ProtonでAWS CDKを使えるのか試してみます。
やってみた
以下の記事を参考に試してみます。
Announcing AWS CDK Support and CodeBuild Provisioning for AWS Proton | Containers
全体のイメージは以下です。
サンプルコードのFork、ローカルへのClone
今回は用意されているサンプルコードを使用します。
記事中ではテンプレートをS3に置く方法を使っていますが、せっかくなのでGithubと同期させる方法でやってみます。
まずは、サンプルコードをForkします。
Githubと連携させるため、少しコードを変更します。
$ git clone <Forkしたリポジトリ名> $ cd cdk/environment-templates/vpc-ecs-cluster $ mkdir v1 $ mv infrastructure v1/ $ mv schema v1/ $ mv README.md v1/ $ git add . $ git commit -m "update: dir" $ git push origin HEAD
環境テンプレートのバージョニング機能の関係で、以下のディレクトリ構成にする必要があるためです。
*/{テンプレート名}/{バージョン}/テンプレート構成
今回であれば、以下のディレクトリ構成になっている必要があります。
$ pwd <WORK DIR>/proton-codebuild-provisioning-examples/cdk/environment-templates $ tree -L 3 . └── vpc-ecs-cluster └── v1 ├── README.md ├── infrastructure └── schema
サンプルコードの内容をみてみる
terraformやpulumiもリポジトリに含まれていますが、今回使用するのはcdk/environment-templates/vpc-ecs-cluster
ディレクトリ配下のものになります。
$ cd cdk/environment-templates/vpc-ecs-cluster/v1 $ tree -L 2 . ├── README.md ├── infrastructure │ ├── bin │ ├── cdk-to-proton.sh │ ├── cdk.json │ ├── jest.config.js │ ├── lib │ ├── manifest.yaml │ ├── package-lock.json │ ├── package.json │ ├── proton-inputs.json │ ├── proton-outputs.json │ └── tsconfig.json └── schema └── schema.yaml
schema/schema.yaml
まずは、スキーマファイルです。 このファイルで、Protonのコンソール上から渡すパラメータを定義します。
このファイルの書き方については、CloudformationでProtonを使う場合と同様です。
schema: format: openapi: "3.0.0" environment_input_type: "EnvironmentInputs" types: EnvironmentInputs: type: object description: "Input properties for my environment" properties: vpc_cidr_block: type: string title: "VPC CIDR block" description: "VPC CIDR block, or default if left blank" default: "10.0.0.0/16" ec2_capacity: type: boolean title: "Enable EC2 Capacity" description: "Enable EC2 capacity for the cluster" default: false ec2_instance_type: type: string title: "EC2 instance types for cluster (if enabled)" description: "If EC2 capacity enabled, instance type to be used" default: "t3.medium" allow_ecs_exec: type: boolean title: "Enable ECS Execute command logging for the cluster" description: "Enable ECS Exec on the cluster" default: false enhanced_cluster_monitoring: type: boolean title: "Enable Container Insights for this cluster" default: false description: "Enable Cloudwatch Container Insights for the cluster" service_discovery_namespace: type: string title: "Service discovery namespace domain" description: "Service discovery domain" required: - service_discovery_namespace
infrastructure/manifest.yaml
CodeBuildプロビジョニングを使うため、manifest.yaml
の書き方がCloudFormationを使う場合と少し異なります。
ざっくり内容としては、cdk deploy
でプロビジョニング・cdk destroy
でデプロビジョニングを行なっています。
outputs.json
を生成して、ステータスの更新をProtonに通知しているようです。
infrastructure: templates: - rendering_engine: codebuild settings: image: aws/codebuild/amazonlinux2-x86_64-standard:4.0 runtimes: nodejs: 16 provision: # Run when create/update is triggered for environment or service # Install dependencies - npm install - npm run cdk deploy -- --require-approval never # Script to convert CFN outputs into outputs for Proton - chmod +x ./cdk-to-proton.sh - cat proton-outputs.json | ./cdk-to-proton.sh > outputs.json # Notify AWS Proton of deployment status - aws proton notify-resource-deployment-status-change --resource-arn $RESOURCE_ARN --status IN_PROGRESS --outputs file://./outputs.json deprovision: # Install dependencies and destroy resources - npm install - npm run cdk destroy -- --force
Wrap up template files for AWS Proton - AWS Proton CodeBuild provisioning template bundle - AWS Proton
infrastructure配下(CDKのコード)
environment-templates/infrastructure
配下にはAWS CDKのコードが入っています。
VPCとECSクラスターを作成するといった内容です。
通常のAWS CDKのコードと異なる点は、proton-inputs.jsonで環境作成時に与えるパラメータを与えているところです。 proton-inputs.jsonに関しては、プロビジョニング時にコンソールから渡した値を元に生成されます。
CDKのコードでエラーを出さないために、仮のものとしてリポジトリ内に含んでいるのかと思います
{ "environment": { "name": "cdk-env-demo", "inputs": { "vpc_cidr_block": "10.0.0.0/16", "ec2_capacity": false, "ec2_instance_type": "t3.medium", "allow_ecs_exec": false, "enhanced_cluster_monitoring": false, "service_discovery_namespace": "proton.cdkdemo.svc" } } }
import { Stack, StackProps, CfnOutput } from "aws-cdk-lib"; import { Construct } from "constructs"; import * as ecs from "aws-cdk-lib/aws-ecs"; import * as ec2 from "aws-cdk-lib/aws-ec2"; import * as autoscaling from "aws-cdk-lib/aws-autoscaling"; import * as iam from "aws-cdk-lib/aws-iam"; import input from "../proton-inputs.json"; export class VpcEcsClusterStack extends Stack { constructor(scope: Construct, id: string, props: StackProps) { super(scope, id, props); const environmentInputs = input.environment.inputs; const stackName = props.stackName ?? input.environment.name; const vpc = new ec2.Vpc(this, "ProtonVPC", { vpcName: stackName, // proton-inputs.jsonの値を渡している cidr: environmentInputs.vpc_cidr_block, }); // 省略
Githubリポジトリとの接続
GithubのリポジトリをProtonから使えるようにするためにリンクを作成します。
GithubアカウントとCodeStar接続が存在しない場合は、以下の手順を参考にGithubアカウントと接続します。
手順完了後にステータスが利用可能になってればOKです。
Protonの画面に戻って、「リポジトリの作成」を選択します。
必要な情報を入力して、リポジトリを作成します。
環境テンプレートの作成
サイドバー
>テンプレート
> 環境テンプレート
>環境テンプレートの作成
を選択します。
テンプレート定義リポジトリは前の手順で作成したリポジトリを指定します。
環境テンプレートの名前
は、vpc-ecs-cluster
とします。
環境テンプレートの名前
は環境テンプレートのディレクトリ名と一致させる必要があります。
(異なっている場合、バージョンが公開できません)
テンプレートを作成するだけでは使用できないため、テンプレートのバージョンを公開します。ステータスがPublished
になればOKです。
CodeBuild用 IAMロールの用意
ProtonでAWS CDKを使用するためには、CodeBuildを使用する必要があります。 そのため、CodeBuild用のIAMロールが必要です。
以下コマンドを実行して、IAMロールを作成します。
$ aws iam create-role --role-name AWSProtonCodeBuildProvisioning --assume-role-policy-document '{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":{"Service":"codebuild.amazonaws.com"},"Action":"sts:AssumeRole"}]}' $ aws iam attach-role-policy --role-name AWSProtonCodeBuildProvisioning --policy-arn arn:aws:iam::aws:policy/AdministratorAccess
環境の作成
それでは登録したテンプレートを使って環境を作成します。
サイドバー
>環境
> 環境を作成する
を選択します。
作成した環境テンプレートを使用します。
環境の名前やIAMロールの情報を設定して、次に進みます。
カスタム設定の画面が出るので、必要な値を設定して次に進みます。 最後に確認画面が出ます。問題なければ作成を行います。
成功するとCloudformationスタックが作成されたことを確認できます。(CodeBuildスタックとCDKで定義したECS,VPCのスタック)
クリーンアップ
Protonのコンソールから環境を削除すると、上記で作成したCloudformationのスタックも削除されます。
おわりに
CodeBuildプロビジョニングで対応するIaCツールが増えて嬉しいです。
AWS CDKへの対応はAWS Proton発表時から要望が多かった機能なので、待ち望んでいた方も多いはずです。
Integrate with AWS Cloud Development Kit (CDK) · Issue #21 · aws/aws-proton-public-roadmap
今回はCDKを紹介しましたが、同様にCodeBuildプロビジョニングでPulumiも使えるようです。
以上、AWS事業本部の佐藤(@chari7311)でした。